iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0

由於地震的關係,花了點時間在整理,假日兩天就這樣沒了,今天進度也一樣很糟糕,開始懷疑能不能完賽了...

接下來要實現消除與掉落的功能,這邊開始邏輯就會複雜了,需要有一些遞迴的概念

首先先定義消除方塊之前,需要帶入甚麼樣的參數
考量到會生成特殊道具,所以需要知道有哪幾個位置是一起消除的
大致上如下:

[[[0,0],[0,1],[0,2]], [[1,3],[1,4],[1,5]]]

有了input,接下來就是針對該格式來進行消除

def removeMatched(self, matches):
    # 消除方塊
    for match in matches:
        for m in match:
            match_x, match_y = m[0], m[1]
            gem = self.getGemByPos(match_x, match_y)
            self.gems_group.remove(gem)
            self.all_gems[match_x][match_y] = None

    # 方塊掉落
    for x in range(NUMGRID):
        # 這邊要由下往上判斷
        for y in range(NUMGRID - 1, 0, -1):
            if self.all_gems[x][y] == None:
                self.dropPuzzle(x, y, 1)
            pass

方塊掉落的部分,由於是由上往下掉,所以判斷會從下面開始,只要有空值從上方的方塊抓下來,如果上方方塊為None則會再往上抓

def dropPuzzle(self, x, y, drop_count):
    if y - drop_count >= 0:
        if self.all_gems[x][y- drop_count] != None:
            self.all_gems[x][y] = self.all_gems[x][y- drop_count]
            gem = self.getGemByPos(x, y)
            gem.drop(drop_count)
            self.all_gems[x][y- drop_count] = None
        else:
            self.dropPuzzle(x, y, drop_count + 1)
    else:
        # 產生新方塊
        # self.gems_group.add(gem)
        pass
    return

再來針對方塊定義掉落的方法

def drop(self, count):
    self.rect.y = self.rect.y + (GRIDSIZE*count)

方法都寫完之後,在run迴圈就要隨時去判斷有無需要消除的方塊,這邊有做個時間限制讓他不要消得太快

self.matches = None
# 如果有方塊符合,則消除
if self.matches != None and pygame.time.get_ticks() - match_ticks >= 500:
    self.removeMatched(self.matches)
    self.matches = None
    match_ticks = pygame.time.get_ticks()

觸發的地方也寫好了,但我根本還沒有寫連三塊消除的功能,那只好先在某個地方代入資料進行測試

# 測試用
elif pygame.mouse.get_pressed()[2] == True:
    self.matches = [[[3, 3], [4, 3]], [[4, 7], [5, 7]]]

到這邊實測了一下,雖然功能正常,但是因為有空白的區域所以左鍵點擊會報錯,明天會去做一下方塊生成的方法


上一篇
Day5 實作拼圖交換功能
下一篇
Day7 消除方塊
系列文
最近迷上了三消遊戲 那就來寫一個自動消珠程式吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言